package 操作.工具类

import kotlin.math.pow

object 数值操作{
    fun 随机数(min: Int, max: Int): Int {
        return (min + Math.random() * (max - min + 1)).toInt()
    }
}
fun Double.是否含小数 (): Boolean {
    // 检查数字是否为整数（没有小数部分）
    return this % 1 != 0.0
}

/**
 * 若有小数则返回完整的字符串，没有则仅显示整数
 */
fun Double.到文本() : String{
    val t = this.toString()
    var right = t.right(".") ?: "0"
    val left = t.left(".")
    if (right.length == 1) right += "0" // 确保显示小数点后两位
    return "$left.$right"
}




fun Double.format(digits: Int): String {
    val factor = 10.0.pow(digits)
    val rounded = kotlin.math.round(this * factor) / factor
    return rounded.toString()
}




/**
 * 中文小写
 */
fun Number.转简体中文小写(): String {
    val units = arrayOf("", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万")
    val nums = arrayOf("零", "一", "二", "三", "四", "五", "六", "七", "八", "九")
    val sb = StringBuilder()

    val numStr = this.toString()
    var isNegative = false

    var integerPart = ""
    var decimalPart = ""

    // 检查负数
    var processedStr = numStr
    if (numStr.startsWith("-")) {
        isNegative = true
        processedStr = numStr.substring(1)
    }

    // 拆分整数和小数部分
    if (processedStr.contains(".")) {
        val parts = processedStr.split(".")
        integerPart = parts[0]
        decimalPart = parts[1]
    } else {
        integerPart = processedStr
    }

    // 添加负号（如果是负数）
    if (isNegative) {
        sb.append("负")
    }

    // 转换整数部分
    val len = integerPart.length
    for (i in 0 until len) {
        val num = integerPart[i] - '0'
        if (i != len - 1 && num != 0) {
            sb.append(nums[num]).append(units[len - 2 - i])
        } else {
            sb.append(nums[num])
        }
    }

    // 转换小数部分
    if (decimalPart.isNotEmpty()) {
        sb.append("点")
        for (ch in decimalPart) {
            sb.append(nums[ch - '0'])
        }
    }

    return sb.toString()
}

/**
 * 中文大写
 */
fun Number.转简体中文大写(): String {
    val units = arrayOf("", "十", "百", "千", "萬", "十", "百", "千", "億", "十", "百", "千", "萬")
    val nums = arrayOf("零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖")
    val sb = StringBuilder()

    val numStr = this.toString()
    var isNegative = false

    var integerPart = ""
    var decimalPart = ""

    // 检查负数
    var processedStr = numStr
    if (numStr.startsWith("-")) {
        isNegative = true
        processedStr = numStr.substring(1)
    }

    // 拆分整数和小数部分
    if (processedStr.contains(".")) {
        val parts = processedStr.split(".")
        integerPart = parts[0]
        decimalPart = parts[1]
    } else {
        integerPart = processedStr
    }

    // 添加负号（如果是负数）
    if (isNegative) {
        sb.append("負")
    }

    // 转换整数部分
    val len = integerPart.length
    for (i in 0 until len) {
        val num = integerPart[i] - '0'
        if (i != len - 1 && num != 0) {
            sb.append(nums[num]).append(units[len - 2 - i])
        } else {
            sb.append(nums[num])
        }
    }

    // 转换小数部分
    if (decimalPart.isNotEmpty()) {
        sb.append("點")
        for (ch in decimalPart) {
            sb.append(nums[ch - '0'])
        }
    }

    return sb.toString()
}

/**
 * 金额简体
 */
fun Number.转金额简体(): String {
    val fraction = arrayOf("角", "分")
    val digit = arrayOf("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")
    val unit = arrayOf("元", "万", "亿", "兆")
    val units = arrayOf("", "拾", "佰", "仟")
    val sb = StringBuilder()

    val numStr = this.toString()
    var isNegative = false

    // 检查负数
    var processedStr = numStr
    // 一个中文 - 一个数字-  全角半角 肉眼分不清
    if (numStr.startsWith("-") || numStr.startsWith("-")) {
        isNegative = true
        processedStr = numStr.substring(1)
    }



    // 拆分整数和小数部分
    val head = processedStr.split(".")[0]
    val tail = processedStr.split(".").getOrNull(1) ?: ""

    // 添加负号（如果是负数）
    if (isNegative) {
        sb.append("负")
    }

    // 处理整数部分
    if (head.toLong() == 0L) {
        sb.append("零")
    } else {
        var integer = head.toLong()
        var j = 0
        while (integer > 0) {
            var str = ""
            var k = 0
            var tmp = integer % 10000
            while (tmp > 0) {
                val p = (tmp % 10).toInt()
                if (p != 0) {
                    str = digit[p] + units[k] + str
                } else if (str.isNotEmpty() && str[0] != '零') {
                    str = digit[p] + str
                }
                k++
                tmp /= 10
            }
            if (str.isNotEmpty()) {
                sb.insert(if (isNegative) 1 else 0, str + unit[j])
            }
            j++
            integer /= 10000
        }
    }



    // 处理小数部分
    if (tail.isNotEmpty()) {
        for (i in tail.indices) {
            if (i > 1) break
            val p = (tail[i] - '0').toInt()
            if (p != 0 || sb.isNotEmpty() && sb.last() != '零') {
                sb.append(digit[p]).append(fraction[i])
            }
        }
    }

    // 如果金额结尾是“元”，且没有角或分，则补全“整”
    if (sb.endsWith("元")) {
        sb.append("整")
    }

    return sb.toString()
}

/**
 * 金额繁体
 */
fun Number.转金额繁体(): String {
    val fraction = arrayOf("角", "分")
    val digit = arrayOf("零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖")
    val unit = arrayOf("元", "萬", "億", "兆")
    val units = arrayOf("", "拾", "佰", "仟")
    val sb = StringBuilder()

    val numStr = this.toString()
    var isNegative = false

    // 檢查負數
    var processedStr = numStr
    if (numStr.startsWith("-")) {
        isNegative = true
        processedStr = numStr.substring(1)
    }

    // 拆分整數與小數部分
    val head = processedStr.split(".")[0]
    val tail = processedStr.split(".").getOrNull(1) ?: ""

    // 添加負號（如果是負數）
    if (isNegative) {
        sb.append("負")
    }

    // 處理整數部分
    if (head.toLong() == 0L) {
        sb.append("零")
    } else {
        var integer = head.toLong()
        var j = 0
        while (integer > 0) {
            var str = ""
            var k = 0
            var tmp = integer % 10000
            while (tmp > 0) {
                val p = (tmp % 10).toInt()
                if (p != 0) {
                    str = digit[p] + units[k] + str
                } else if (str.isNotEmpty() && str[0] != '零') {
                    str = digit[p] + str
                }
                k++
                tmp /= 10
            }
            if (str.isNotEmpty()) {
                sb.insert(0, str + unit[j])
            }
            j++
            integer /= 10000
        }
    }

    // 處理小數部分
    if (tail.isNotEmpty()) {
        for (i in tail.indices) {
            if (i > 1) break
            val p = (tail[i] - '0').toInt()
            if (p != 0 || sb.isNotEmpty() && sb.last() != '零') {
                sb.append(digit[p]).append(fraction[i])
            }
        }
    }

    // 如果金額結尾是「元」，且沒有角或分，則補全「整」
    if (sb.endsWith("元")) {
        sb.append("整")
    }

    return sb.toString()
}

fun Double.转货币金额(): String {
    // 将整数和小数分开处理
    val parts = this.toString().split(".")
    val integerPart = parts[0].reversed().chunked(3).joinToString(",").reversed()
    val decimalPart = if (parts.size > 1) "." + parts[1].padEnd(2, '0').take(2) else ""
    return integerPart + decimalPart
}